package org.dcarew.halostatus;

import org.dcarew.halostatus.utils.HaloStatusUpdateJob;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

/**
 * The plugin class for the Halo status project.
 * 
 * @author Devon Carew
 */
public class HaloStatusPlugin
	extends AbstractUIPlugin
{
	public static final String PLUGIN_ID 			= "org.dcarew.halostatus";
	public static final String HALO_3_URL 			= "http://www.bungie.net/Projects/Halo3/default.aspx";
	public static final String PLAYER_COUNT_PREF	= "playerCount";
	
	private static HaloStatusPlugin	plugin;
	
	
	/**
	 * The constructor
	 */
	public HaloStatusPlugin()
	{
		
	}
	
	public void start(BundleContext context)
		throws Exception
	{
		super.start(context);
		
		plugin = this;
		
		HaloStatusUpdateJob statusJob = new HaloStatusUpdateJob();
		
		statusJob.schedule(5000);
	}
	
	public void stop(BundleContext context)
		throws Exception
	{
		plugin = null;
		
		super.stop(context);
	}
	
	/**
	 * Returns the shared instance
	 * 
	 * @return the shared instance
	 */
	public static HaloStatusPlugin getPlugin()
	{
		return plugin;
	}

	/**
	 * Returns an image descriptor for the image file at the given plug-in relative path.
	 * 
	 * @param path the path
	 * @return the image descriptor
	 */
	public static ImageDescriptor getImageDescriptor(String path)
	{
		return imageDescriptorFromPlugin(PLUGIN_ID, path);
	}
	
    /**
     * Get an image given a path relative to this plugin.
     * 
     * @param path
     * @return
     */
    public static Image getImage(String path)
    {
        if (getPlugin().getImageRegistry().get(path) != null)
            return getPlugin().getImageRegistry().get(path);

        ImageDescriptor descriptor = findImageDescriptor(path);

        if (descriptor != null)
        {
            getPlugin().getImageRegistry().put(path, descriptor);

            return getPlugin().getImageRegistry().get(path);
        }

        return null;
    }
    
    /**
	 * Returns an image descriptor for the image file at the given plug-in relative path.
	 * 
	 * @param path the path
	 * @return the image descriptor
	 */
	public static ImageDescriptor getBundledImageDescriptor(String path)
	{
		return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path);
	}

    /**
	 * Respects images residing in any plug-in. If path is relative, then this bundle is looked up
	 * for the image, otherwise, for absolute path, first segment is taken as id of plug-in with
	 * image
	 * 
	 * @param path the path to image, either absolute (with plug-in id as first segment), or
	 *        relative for bundled images
	 * @return the image descriptor
	 */
	public static ImageDescriptor findImageDescriptor(String path)
	{
		final IPath p = new Path(path);
		
		if (p.isAbsolute() && p.segmentCount() > 1)
		{
			return AbstractUIPlugin.imageDescriptorFromPlugin(
				p.segment(0), p.removeFirstSegments(1).makeAbsolute().toString());
		}
		else
		{
			return getBundledImageDescriptor(p.makeAbsolute().toString());
		}
	}

	public String getPlayerCount()
	{
		return getPreferenceStore().getString(PLAYER_COUNT_PREF);
	}
	
	public void setPlayerCount(String haloPlayerCount)
	{
		if (haloPlayerCount == null)
			haloPlayerCount = "0";
		
		getPreferenceStore().setValue(PLAYER_COUNT_PREF, haloPlayerCount);
	}
    
}
